package com.zenithmind.chat.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.chat.pojo.entity.ChatMessageRead;
import com.zenithmind.chat.pojo.vo.ChatUserVO;
import com.zenithmind.chat.pojo.vo.ChatMessageReadVO;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 消息已读记录服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface ChatMessageReadService extends IService<ChatMessageRead> {

    /**
     * 查询消息已读用户列表
     * 
     * @param messageId 消息ID
     * @return 已读用户列表
     */
    List<ChatUserVO> getMessageReadUsers(String messageId);

    /**
     * 查询消息未读用户列表
     * 
     * @param messageId 消息ID
     * @param groupId 群组ID
     * @return 未读用户列表
     */
    List<ChatUserVO> getMessageUnreadUsers(String messageId, String groupId);

    /**
     * 标记消息为已读
     * 
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 标记结果
     */
    Boolean markMessageAsRead(String messageId, String userId);

    /**
     * 批量标记消息为已读
     * 
     * @param messageIds 消息ID列表
     * @param userId 用户ID
     * @return 标记结果
     */
    Boolean batchMarkAsRead(List<String> messageIds, String userId);

    /**
     * 标记群组所有消息为已读
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 标记结果
     */
    Boolean markGroupMessagesAsRead(String groupId, String userId);

    /**
     * 检查用户是否已读消息
     * 
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 是否已读
     */
    Boolean checkUserReadMessage(String messageId, String userId);

    /**
     * 查询用户在群组中的最后已读时间
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 最后已读时间
     */
    LocalDateTime getUserLastReadTime(String groupId, String userId);

    /**
     * 统计消息已读数量
     * 
     * @param messageId 消息ID
     * @return 已读数量
     */
    Integer countMessageReadUsers(String messageId);

    /**
     * 统计用户未读消息数量
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 未读数量
     */
    Integer countUserUnreadMessages(String groupId, String userId);

    /**
     * 清理过期已读记录
     * 
     * @param days 保留天数
     * @return 清理数量
     */
    Integer cleanExpiredReadRecords(Integer days);

    /**
     * 获取已读统计信息
     *
     * @param messageId 消息ID（可选）
     * @param groupId 群组ID（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 统计信息
     */
    Object getReadStatistics(String messageId, String groupId, String startTime, String endTime);

    // Controller需要的额外方法

    /**
     * 标记消息为已读（Controller调用）
     *
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean markAsRead(String messageId, String userId);

    /**
     * 标记所有消息为已读（Controller调用）
     *
     * @param userId 用户ID
     * @param groupId 群组ID
     * @param sessionId 会话ID
     * @return 是否成功
     */
    Boolean markAllAsRead(String userId, String groupId, String sessionId);

    /**
     * 获取消息阅读者列表（Controller调用）
     *
     * @param messageId 消息ID
     * @return 阅读者列表
     */
    List<ChatMessageReadVO> getMessageReaders(String messageId);

    /**
     * 获取未读用户列表（Controller调用）
     *
     * @param messageId 消息ID
     * @return 未读用户列表
     */
    List<String> getUnreadUsers(String messageId);

    /**
     * 获取用户未读消息数量（Controller调用）
     *
     * @param userId 用户ID
     * @param groupId 群组ID
     * @param sessionId 会话ID
     * @return 未读数量
     */
    Integer getUserUnreadCount(String userId, String groupId, String sessionId);

    /**
     * 获取群组未读消息数量（Controller调用）
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 未读数量
     */
    Integer getGroupUnreadCount(String groupId, String userId);

    /**
     * 获取会话未读消息数量（Controller调用）
     *
     * @param sessionId 会话ID
     * @param userId 用户ID
     * @return 未读数量
     */
    Integer getSessionUnreadCount(String sessionId, String userId);

    /**
     * 检查消息是否已读（Controller调用）
     *
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 是否已读
     */
    Boolean isMessageRead(String messageId, String userId);

    /**
     * 获取消息阅读统计（Controller调用）
     *
     * @param messageId 消息ID
     * @return 统计信息
     */
    Object getMessageReadStatistics(String messageId);

    /**
     * 获取群组阅读统计（Controller调用）
     *
     * @param groupId 群组ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计信息
     */
    Object getGroupReadStatistics(String groupId, String startDate, String endDate);

    /**
     * 更新阅读时间（Controller调用）
     *
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean updateReadTime(String messageId, String userId);

    /**
     * 清理阅读记录（Controller调用）
     *
     * @param days 保留天数
     * @return 清理数量
     */
    Integer clearReadRecords(Integer days);

    /**
     * 获取用户阅读历史（Controller调用）
     *
     * @param userId 用户ID
     * @param page 页码
     * @param size 页大小
     * @return 阅读历史
     */
    List<ChatMessageReadVO> getUserReadHistory(String userId, Integer page, Integer size);
}
